#coding:utf8
import pickle
import base64
from django_redis import get_redis_connection

"""
将cookie数据合并到redis中
"""

def merge_cookie_to_redis(request,user,response):

    """
    cookie:  {sku_id:{'count':xx,'selected':'xxx'}}
    cookie: {2:{count:8,selected:true},4:{count:10,selected:False},}

    redis: {sku_id:count}
    cart: {1:20,4:200}
    selected: [1,4]

    #最终数据
    redis: {1:20,4:10,2:8}

    将cookie数据合并到redis中 ,如何合并? 合并的规则是什么?
    1. 数据以 Cookie为准, redis的数据全都删掉
    2. 数据以 Redis为准, 如果 cookie中含有 redis没有的商品id,则将cookie中的商品id,添加到redis中
                    如果cookie中含有 redis也有的商品, 合并的时候,商品个数以 cookie以准

    # 1.先读取 cookie数据,
    # 2.获取redis的数据(旧的redis数据)
    # 3.对cookie数据进行遍历,然后将数据添加到新的redis数据中
    # 4.再把新的redis数据保存到redis中

    """

    # 1.先读取 cookie数据
    cookie_str = request.COOKIES.get('cart')

    if cookie_str is not None:
        cookie_cart = pickle.loads(base64.b64decode(cookie_str))

        # 2.获取redis的数据(旧的redis数据)
        # 2.1 连接redis
        redis_conn = get_redis_connection('cart')
        # 2.2 得到 redis的数据  user???
        redis_cart = redis_conn.hgetall('cart_%s'%user.id)
        # {b'sku_id':b'count'}
        redis_selected_ids = redis_conn.smembers('cart_selected_%s'%user.id)

        # 2.3 redis的数据是bytes类型,我们需要给它进行转换
        cart = {}
        # {sku_id:count,sku_id:count}
        for sku_id,count in redis_cart.items():
            cart[sku_id.decode()] = int(count)

        ids_list = []
        for sku_id in redis_selected_ids:
            ids_list.append(int(sku_id))

        # 3.对cookie数据进行遍历,然后将数据添加到新的redis数据中
        #cookie: {2:{count:8,selected:true},4:{count:10,selected:False},}
        # cart: {sku_id:count,sku_id:count}
        for sku_id,count_selected_dict in cookie_cart.items():
            # 如果 cookie中含有 redis没有的商品id,则将cookie中的商品id,添加到redis中
            cart[sku_id] = count_selected_dict['count']
            # 如果cookie中含有 redis也有的商品, 合并的时候,商品个数以 cookie以准

            #选中状态
            if count_selected_dict['selected']:
                #添加到 选中的列表中
                ids_list.append(sku_id)



        # 4.再把新的redis数据保存到redis中
        # cart:  {1:20,4:10,2:8}
        # ids_list : [1,2,4]
        redis_conn.hmset('cart_%s'%user.id,cart)

        # list = [1,2,3]
        # *list 对列表进行拆包
        # cart= {1:20,4:10,2:8}
        # **cart 对字典进行拆包
        redis_conn.sadd('cart_selected_%s'%user.id,*ids_list)


        # 合并完成之后,cookie数据 需要清除
        response.delete_cookie('cart')

        return response
    else:
        return response